package com.wenyl.tree;

import lombok.Data;

@Data
/**
 * ArrayBinaryTree类表示一个使用数组实现的二叉树。
 * 该类提供了三种遍历二叉树的方法：前序遍历、中序遍历和后序遍历，
 * 以及设置左右子节点的方法。
 */
public class ArrayBinaryTree {
    /**
     * 存储二叉树节点的数组
     */
    private char[] treeNodes;
    
    /**
     * 数组的最大大小，限制了树的最大节点数
     */
    private final int MAX_SIZE = 7;

    /**
     * 构造函数，初始化二叉树数组
     */
    public ArrayBinaryTree(){
        treeNodes = new char[MAX_SIZE];
    }

    /**
     * 前序遍历二叉树
     * 遍历顺序：根节点 -> 左子树 -> 右子树
     * @param index 当前节点的索引
     */
    public void preOrderTraversal(int index){
        if(index >= MAX_SIZE || treeNodes[index] == '\0'){
            return;
        }
        System.out.print(treeNodes[index]+" ");
        preOrderTraversal(2*index+1);
        preOrderTraversal(2*index+2);
    }

    /**
     * 中序遍历二叉树
     * 遍历顺序：左子树 -> 根节点 -> 右子树
     * @param index 当前节点的索引
     */
    public void inOrderTraversal(int index){
        if(index >= MAX_SIZE || treeNodes[index] == '\0'){
            return;
        }
        inOrderTraversal(2*index+1);
        System.out.print(treeNodes[index]+" ");
        inOrderTraversal(2*index+2);
    }

    /**
     * 后序遍历二叉树
     * 遍历顺序：左子树 -> 右子树 -> 根节点
     * @param index 当前节点的索引
     */
    public void postOrderTraversal(int index){
        if(index >= MAX_SIZE || treeNodes[index] == '\0'){
            return;
        }
        postOrderTraversal(2*index+1);
        postOrderTraversal(2*index+2);
        System.out.print(treeNodes[index]+" ");
    }

    /**
     * 设置指定节点的左子节点
     * @param index 父节点的索引
     * @param data 左子节点的数据
     */
    public void setLeftChild(int index, char data){
        if(2*index+1 >= MAX_SIZE){
            System.out.println("超出数组范围");
            return;
        }
        treeNodes[2*index+1] = data;
    }

    /**
     * 设置指定节点的右子节点
     * @param index 父节点的索引
     * @param data 右子节点的数据
     */
    public void setRightChild(int index, char data){
        if(2*index+2 >= MAX_SIZE){
            System.out.println("超出数组范围");
            return;
        }
        treeNodes[2*index+2] = data;
    }
}
